Skip to content
0

Spring Boot - 通用响应类

响应类

一个规范的响应不应该只返回各种数据,而是要有一个规范的结果响应类,下面给出我使用的结果响应类(放在 http 包里):

java
/**
 * @author kele-Bingtang
 * @date 2022/4/30 14:47
 * @note 响应对象
 */
public class Response<T> implements Serializable {
    private static final long serialVersionUID = -464624820023286858L;
    /** 自定义状态码 **/
    private Integer code;
    /** 状态码信息 **/
    protected String status;
    /** 消息 **/
    private String message;
    /** 时间戳 **/
    private Long timestamp;
    /** 数据 **/
    protected transient T data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static <T> Response<T> instance() {
        return new Response<>();
    }

}

然后使用工具类进行处理并返回

java
/**
 * @author kele-Bingtang
 * @date 2022/4/30 14:55
 * @note 请求响应封装
 */
public class HttpResult {

    private HttpResult() {
    }

    public static <T> Response<T> response(T data, ResponseStatusEnum responseStatusEnum) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(responseStatusEnum.getCode());
        response.setStatus(responseStatusEnum.getStatus());
        response.setMessage(responseStatusEnum.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> response(T data, ResponseStatusEnum responseStatusEnum, String message) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(responseStatusEnum.getCode());
        response.setStatus(responseStatusEnum.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<Map<String, T>> response(String key, T data, ResponseStatusEnum status) {
        Map<String, T> map = new HashMap<>(16);
        Response<Map<String, T>> response = Response.instance();
        map.put(key, data);
        response.setData(map);
        response.setCode(status.getCode());
        response.setStatus(status.getStatus());
        response.setMessage(status.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> response(T data, Integer code, String status, String message) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(code);
        response.setStatus(status);
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<Map<String, T>> response(String key, T data, Integer code, String status, String message) {
        Map<String, T> map = new HashMap<>(16);
        Response<Map<String, T>> response = Response.instance();
        map.put(key, data);
        response.setData(map);
        response.setCode(code);
        response.setStatus(status);
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> ok(T data) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(ResponseStatusEnum.SUCCESS.getCode());
        response.setStatus(ResponseStatusEnum.SUCCESS.getStatus());
        response.setMessage(ResponseStatusEnum.SUCCESS.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<Map<String, T>> ok(String key, T data) {
        Map<String, T> map = new HashMap<>(16);
        Response<Map<String, T>> response = Response.instance();
        map.put(key, data);
        response.setData(map);
        response.setCode(ResponseStatusEnum.SUCCESS.getCode());
        response.setStatus(ResponseStatusEnum.SUCCESS.getStatus());
        response.setMessage(ResponseStatusEnum.SUCCESS.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> okMessage(String message) {
        Response<T> response = Response.instance();
        response.setData(null);
        response.setCode(ResponseStatusEnum.SUCCESS.getCode());
        response.setStatus(ResponseStatusEnum.SUCCESS.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> fail(T data) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(ResponseStatusEnum.FAIL.getCode());
        response.setStatus(ResponseStatusEnum.FAIL.getStatus());
        response.setMessage(ResponseStatusEnum.FAIL.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<Map<String, T>> fail(String key, T data) {
        Map<String, T> map = new HashMap<>(16);
        Response<Map<String, T>> response = Response.instance();
        map.put(key, data);
        response.setData(map);
        response.setCode(ResponseStatusEnum.FAIL.getCode());
        response.setStatus(ResponseStatusEnum.FAIL.getStatus());
        response.setMessage(ResponseStatusEnum.FAIL.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> fail(ResponseStatusEnum responseStatusEnum, String message) {
        return returnResponse(responseStatusEnum, message);
    }

    public static <T> Response<T> failMessage(String message) {
        Response<T> response = Response.instance();
        response.setData(null);
        response.setCode(ResponseStatusEnum.FAIL.getCode());
        response.setStatus(ResponseStatusEnum.FAIL.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> failMessage(Integer code, String message) {
        return returnResponse(code, message);
    }

    public static <T> Response<T> error(T data) {
        Response<T> response = Response.instance();
        response.setData(data);
        response.setCode(ResponseStatusEnum.ERROR.getCode());
        response.setStatus(ResponseStatusEnum.ERROR.getStatus());
        response.setMessage(ResponseStatusEnum.ERROR.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<Map<String, T>> error(String key, T data) {
        Map<String, T> map = new HashMap<>(16);
        Response<Map<String, T>> response = Response.instance();
        map.put(key, data);
        response.setData(map);
        response.setCode(ResponseStatusEnum.ERROR.getCode());
        response.setStatus(ResponseStatusEnum.ERROR.getStatus());
        response.setMessage(ResponseStatusEnum.ERROR.getMessage());
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> error(ResponseStatusEnum responseStatusEnum, String message) {
        return returnResponse(responseStatusEnum, message);
    }

    public static <T> Response<T> errorMessage(String message) {
        Response<T> response = Response.instance();
        response.setData(null);
        response.setCode(ResponseStatusEnum.ERROR.getCode());
        response.setStatus(ResponseStatusEnum.ERROR.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    public static <T> Response<T> errorMessage(Integer code, String message) {
        return returnResponse(code, message);
    }

    public static <T> Response<T> okOrFail(T data, String message) {
        if (null == data) {
            return response(null, ResponseStatusEnum.FAIL, ResponseStatusEnum.FAIL.getMessage());
        }
        return response(data, ResponseStatusEnum.SUCCESS, message);
    }

    public static <T> Response<T> okOrFail(T data) {
        if (null == data) {
            return response(null, ResponseStatusEnum.FAIL);
        }
        return response(null, ResponseStatusEnum.SUCCESS);
    }

    private static <T> Response<T> returnResponse(ResponseStatusEnum responseStatusEnum, String message) {
        Response<T> response = Response.instance();
        response.setData(null);
        response.setCode(responseStatusEnum.getCode());
        response.setStatus(responseStatusEnum.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

    private static <T> Response<T> returnResponse(Integer code, String message) {
        Response<T> response = Response.instance();
        response.setData(null);
        response.setCode(code);
        response.setStatus(ResponseStatusEnum.ERROR.getStatus());
        response.setMessage(message);
        response.setTimestamp(Instant.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        return response;
    }

}

一些常用的响应状态枚举类:

java
/**
 * @author Young Kbt
 * @date 2022/4/30 15:19
 * @note 响应状态枚举类
 */
public enum ResponseStatusEnum {
    /**
     * 规范响应体中的响应码和响应信息
     */
    SUCCESS(HttpServletResponse.SC_OK, "success", "操作成功"),
    /**
     * 操作失败
     */
    FAIL(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "fail", "操作失败"),
    /**
     * 操作错误
     */
    ERROR(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "error", "操作错误"),
    /**
     * 请求未授权
     */
    UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "fail", "请求未授权"),

    /**
     * 客户端请求未授权
     */
    CLIENT_UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "fail", "客户端请求未授权"),

    /**
     * 404 没找到请求
     */
    NOT_FOUND(HttpServletResponse.SC_NOT_FOUND, "fail", "404 没找到请求"),

    /**
     * 消息不能读取
     */
    MSG_NOT_READABLE(HttpServletResponse.SC_BAD_REQUEST, "fail", "消息不能读取"),

    /**
     * 不支持当前请求方法
     */
    METHOD_NOT_SUPPORTED(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "fail", "不支持当前请求方法"),

    /**
     * 不支持当前媒体类型
     */
    MEDIA_TYPE_NOT_SUPPORTED(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "fail", "不支持当前媒体类型"),

    /**
     * 请求被拒绝
     */
    REQ_REJECT(HttpServletResponse.SC_FORBIDDEN, "fail", "请求被拒绝"),

    /**
     * 服务器异常
     */
    INTERNAL_SERVER_ERROR(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "fail", "服务器异常"),

    /**
     * 非法请求
     */
    ILLEGALITY_REQUEST(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "fail", "非法请求"),

    /**
     * 缺少必要的请求参数
     */
    PARAM_MISS(HttpServletResponse.SC_BAD_REQUEST, "fail", "缺少必要的请求参数"),

    /**
     * 请求参数类型错误
     */
    PARAM_TYPE_ERROR(HttpServletResponse.SC_BAD_REQUEST, "fail", "请求参数类型错误"),

    /**
     * 请求参数绑定错误
     */
    PARAM_BIND_ERROR(HttpServletResponse.SC_BAD_REQUEST, "fail", "请求参数绑定错误"),

    /**
     * 参数校验失败
     */
    PARAM_VALID_ERROR(HttpServletResponse.SC_BAD_REQUEST, "fail", "参数校验失败");


    private Integer code;

    private String status;

    private String message;

    ResponseStatusEnum(Integer code, String status, String message) {
        this.code = code;
        this.status = status;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

如何使用呢?如下:

java
@RestController
public class UserController {

    @GetMapping("/login")
    public Response<String> login() {
        return HttpResult.ok("login successfully!");
    }
}

Response 作为返回类型,指定返回的 data 是 String,然后用 HttpResult 的静态方法返回。

最近更新